package com.design.patterns.behavioralModel.singleton;

public class Singleton {

    // 静态字段引用唯一实例:
    private static final Singleton INSTANCE = new Singleton();
    //或者直接将变量暴露给外部
    //public static final Singleton INSTANCE = new Singleton();

    // 通过静态方法返回实例:
    public static Singleton getInstance() {
        return INSTANCE;
    }

    /**
     * 考虑懒加载问题
     * 当我们需要懒加载的时候，不希望直接创建对象
     */
    /**
     * // 添加synchronized关键字是为了保证线程安全，但会严重影响并发性能
     * public synchronized static Singleton getInstance() {
     *     if (INSTANCE == null) {
     *         INSTANCE = new Singleton();
     *     }
     *     return INSTANCE;
     * }
     * //双重检查，但是基于java内存模型，这里是不成立的
     * public static Singleton getInstance() {
     *     if (INSTANCE == null) {
     *         synchronized (Singleton.class) {
     *             if (INSTANCE == null) {
     *                 INSTANCE = new Singleton();
     *             }
     *         }
     *     }
     *     return INSTANCE;
     * }
     */

    // private构造方法保证外部无法实例化:
    private Singleton() {
    }
}